package model;

import java.awt.Color;
import java.awt.Point;

import controller.Spiel;

public class KISpieler extends Spieler {
	public Point[] distanceMap;
	public Point favoritePoint;

	public KISpieler(String name, Color farbe, char leftKey, char rightKey) {
		super(name, farbe, leftKey, rightKey);
	}

	public void decideAction(Spielfeld spielfeld) {
		if (this.isTot())
			return;

		// In allen Richtungen schauen, wie weit man fahren kann.
		// Dann die weiteste Richtung nehmen
		double richtung = 0;
		int distance = 0;
		Linie l = this.getLinie();

		// In Von 180 Grad links nach 180 Grad rechts gucken
		double Pi_2 = Math.PI / 2;
		int maxDist = Math.min(Spiel.GAME_HEIGHT, Spiel.GAME_WIDTH);

		if (distanceMap == null) {
			distanceMap = new Point[41];
			for (int i = 0; i < distanceMap.length; i++) {
				distanceMap[i] = new Point(0, 0);
			}
		}
		for (int n = -20; n <= 20; n++) {
			float phi = l.phi;
			Schritt step = l.lastSchritt;

			for (int d = 2; d <= maxDist; d++) {
				if (d - 2 < Math.abs(n)) {
					// Drehen
					if (n < 0) {
						phi -= Math.PI / 20 * l.transform.phiFaktor.getValue();
					} else {
						phi += Math.PI / 20 * l.transform.phiFaktor.getValue();
					}
				}

				step = Schritt.createSchritt(step, phi, l.v
						* l.transform.vFaktor.getValue(), l.width
						* l.transform.widthFaktor.getValue(), this.getFarbe());

				distanceMap[n + 20].setLocation((int) step.getMiddleX(),
						(int) step.getMiddleY());
				if (spielfeld.collides(step)) {
					break;
				} else if (d > distance || (d == distance && Math.abs(phi) < Math.abs(richtung))) {
					float x = step.getFinalX();
					float y = step.getFinalY();
					if (x < 0) {
						x += Spiel.GAME_WIDTH;
						step = Schritt.createJumpSchritt(step, x, y);
					} else if (x > Spiel.GAME_WIDTH) {
						x -= Spiel.GAME_WIDTH;
						step = Schritt.createJumpSchritt(step, x, y);
					}
					if (y < 0) {
						y += Spiel.GAME_HEIGHT;
						step = Schritt.createJumpSchritt(step, x, y);
					} else if (y > Spiel.GAME_HEIGHT) {
						y -= Spiel.GAME_HEIGHT;
						step = Schritt.createJumpSchritt(step, x, y);
					}

					distance = d;
					richtung = phi;
					this.favoritePoint = distanceMap[n + 20];
				}
			}
		}

		if (richtung - l.phi > Pi_2 / 40) {
			this.setLeftPressed(true);
			this.setRightPressed(false);
		} else if (richtung - l.phi < -Pi_2 / 30) {
			this.setLeftPressed(false);
			this.setRightPressed(true);
		} else {
			this.setLeftPressed(false);
			this.setRightPressed(false);
		}
	}
}
